#INCLUDE "PROTHEUS.CH"
#INCLUDE "HEADERGD.CH"
#include "RWMAKE.CH"
#include "Topconn.ch"

/*
+-------------------------+-------------------------------------------+----------------------+
|Funcao: ChamMat          |Ghandy						          		    | Data: 01/07/2013     |
+-------------------------+-------------------------------------------+----------------------+
|Descricao: Funcao para fazer consulta em chamados e materiais usados no chamado		         |
+--------------------------------------------------------------------------------------------+
|Uso: Modulo Gestao de Servicos - Consultar registro das tabelas ZZJ e ZZO - Chamado Sitema  |
|	   Jupiter Mobile                                                                        	|
+--------------------------------------------------------------------------------------------+
|                     ATUALIZACOES SOFRIDAS DESDE A CONSTRUCAO INICIAL.                      |
+-------------------------+------------+-----------------------------------------------------+
|Programador              |   Data     |             Motivo da Alteracao                     |
+-------------------------+------------+-----------------------------------------------------+
|Ghandy                   | 01/08/2013 | Incluido checagem de data para interromper execucao |
| 			                 | 				| do piloto														   |
+-------------------------+------------+-----------------------------------------------------+
*/

User Function ChamMat()

	Private cCadastro	:= "Consulta Materiais Usados no Chamado"
	
	Private aRotina 	:= MenuDef()
	
	IF Date() > CTOD("28/08/2013")
		MsgBox("O prazo para teste se encerrou em 28/08/2013.", "Prazo Expirado", "Alert")
		Return .F.
	ENDIF

	mBrowse( 6 , 1 , 22 , 75 , "ZZJ" )
	
Return( NIL )

/*/
	Funcao:		MenuDef
	Autor:		Marinaldo de Jesus
	Descricao:	Opcoes do Menu aRotina
	Uso:		Generico
/*/
Static Function MenuDef()
Return(;
			{;
				{ "Pesquisar"	,	"AxPesqui"  										  				, 0 , 1 ,0  , .F. },;
				{ "Visualizar"	,	"StaticCall(u_ChamMat,ChaMnt,'ZZJ',ZZJ->(Recno()),2)" , 0 , 2 ,0  , NIL },;
				{ "Incluir"		,	"StaticCall(u_ChamMat,ChaMnt,'ZZJ',ZZJ->(Recno()),3)" , 0 , 3 ,0  , NIL },;
				{ "Alterar"		,	"StaticCall(u_ChamMat,ChaMnt,'ZZJ',ZZJ->(Recno()),4)" , 0 , 4 ,15 , NIL },;
				{ "Excluir"		,	"StaticCall(u_ChamMat,ChaMnt,'ZZJ',ZZJ->(Recno()),5)" , 0 , 5 ,16 , NIL } ; 
			}; 
		)


/*/
	Funcao:		Ex1Mnt
	Autor:		Marinaldo de Jesus
	Descricao:	Rotina de Manutencao do Exemplo da Modelo3
	Uso:		Generico
/*/
Static Function ChaMnt( cAlias , nReg , nOpc )

	Local aZZJCols		:= {}
	Local aSvZZJCols	:= {}
	Local aZZJHeader	:= {}
	Local aZZJFields	:= {}
	Local aZZJVirtEn	:= {}
	Local aZZJVisuEn	:= {}
	Local aZZJNotFields	:= {}
	Local aZZJAltera	:= {}
	Local aZZJNaoAlt	:= {}
	Local aZZJRecnos	:= {}
	Local aZZJKeys		:= {}

	Local aZZOKeys
	Local aZZOVirtGd
	Local aZZOVisuGd
	Local aZZONotFields	:= { }
//	gHANDY EM 01/07/13 Local aZZONotFields	:= { "FC_TES" }
	Local aZZORecnos
	Local aSvZZOCols

	Local bGetZZJ
	Local bGetZZO

	Local cZZJFil		:= ""
	Local cZZJCodigo	:= ""
	Local cZZOKeySeek

	Local lMod3Ret		:= .F.
	Local lLocks		:= .F.
	Local lExecLock		:= ( ( nOpc <> 2 ) /*/Visualizacao/*/ .and. ( nOpc <> 3 ) /*/Inclusao/*/ )

	Local nLoop			:= 0
	Local nOpcGD		:= nOPC
	Local nZZJUsado		:= 0
	Local nZZOUsado		:= 0
	Local nZZOOrder		:= RetOrder( "ZZO" , "ZO_FILIAL+ZO_CHAMADO+ZO_CODPRO" )

	Private aCols		:= {}
	Private aHeader		:= {}

	Private aGets
	Private aTela

	Private n			:= 1

	BEGIN SEQUENCE

		aRotSetOpc( cAlias , @nReg , nOpc )

		bGetZZJ			:= { |lLock,lExclu|	IF( lExecLock , ( lLock := .T. , lExclu	:= .T. ) , aZZJKeys := NIL ),;
											aZZJCols := ZZJ->(;
									  							GdBuildCols(	@aZZJHeader		,;	//01 -> Array com os Campos do Cabecalho da GetDados
																				@nZZJUsado		,;	//02 -> Numero de Campos em Uso
																				@aZZJVirtEn		,;	//03 -> [@]Array com os Campos Virtuais
																				@aZZJVisuEn		,;	//04 -> [@]Array com os Campos Visuais
																				"ZZJ"			,;	//05 -> Opcional, Alias do Arquivo Carga dos Itens do aCols
																				aZZJNotFields	,;	//06 -> Opcional, Campos que nao Deverao constar no aHeader
																				@aZZJRecnos		,;	//07 -> [@]Array unidimensional contendo os Recnos
																				"ZZJ"		   	,;	//08 -> Alias do Arquivo Pai
																				NIL				,;	//09 -> Chave para o Posicionamento no Alias Filho
																				NIL				,;	//10 -> Bloco para condicao de Loop While
																				NIL				,;	//11 -> Bloco para Skip no Loop While
																				NIL				,;	//12 -> Se Havera o Elemento de Delecao no aCols 
																				NIL				,;	//13 -> Se Sera considerado o Inicializador Padrao
																				NIL				,;	//14 -> Opcional, Carregar Todos os Campos
																				NIL				,;	//15 -> Opcional, Nao Carregar os Campos Virtuais
																				NIL				,;	//16 -> Opcional, Utilizacao de Query para Selecao de Dados
																				NIL				,;	//17 -> Opcional, Se deve Executar bKey  ( Apenas Quando TOP )
																				NIL				,;	//18 -> Opcional, Se deve Executar bSkip ( Apenas Quando TOP )
																				NIL				,;	//19 -> Carregar Coluna Fantasma
																				NIL				,;	//20 -> Inverte a Condicao de aNotFields carregando apenas os campos ai definidos
																				NIL				,;	//21 -> Verifica se Deve Checar se o campo eh usado
																				NIL				,;	//22 -> Verifica se Deve Checar o nivel do usuario
																				NIL				,;	//23 -> Verifica se Deve Carregar o Elemento Vazio no aCols
																				@aZZJKeys		,;	//24 -> [@]Array que contera as chaves conforme recnos
																				@lLock			,;	//25 -> [@]Se devera efetuar o Lock dos Registros
																				@lExclu			 ;	//26 -> [@]Se devera obter a Exclusividade nas chaves dos registros
																		    );
															  ),;
											IF( lExecLock , ( lLock .and. lExclu ) , .T. );
		  					} 
	
	    IF !( lLocks := WhileNoLock( "ZZJ" , NIL , NIL , 1 , 1 , .T. , 1 , 5 , bGetZZJ ) )
			Break
		EndIF

		MkArrEdFlds( nOpc , aZZJHeader , aZZJVisuEn , aZZJVirtEn , @aZZJNaoAlt , @aZZJAltera , @aZZJFields )

   		For nLoop := 1 To nZZJUsado
   			SetMemVar( aZZJHeader[ nLoop , __AHEADER_FIELD__ ] , aZZJCols[ 01 , nLoop ] , .T. )
   		Next nLoop

		cZZJFil		:= ZZJ->ZJ_FILIAL
		cZZJCodigo	:= ZZJ->ZJ_NUM
		cZZOKeySeek	:= cZZJFil+cZZJCodigo

		ZZO->( dbSetOrder( nZZOOrder ) )

		ZZO->( dbSeek( cZZOKeySeek , .F. ) )

		bGetZZO	:= { |lLock,lExclu|	IF( lExecLock , ( lLock := .T. , lExclu := .T. ) , aZZOKeys := NIL ),;
						 				aCols := ZZO->(;
														GdBuildCols(	@aHeader		,;	//01 -> Array com os Campos do Cabecalho da GetDados
																		@nZZOUsado		,;	//02 -> Numero de Campos em Uso
																		@aZZOVirtGd		,;	//03 -> [@]Array com os Campos Virtuais
																		@aZZOVisuGd		,;	//04 -> [@]Array com os Campos Visuais
																		"ZZO"				,;	//05 -> Opcional, Alias do Arquivo Carga dos Itens do aCols
																		aZZONotFields	,;	//06 -> Opcional, Campos que nao Deverao constar no aHeader
																		@aZZORecnos		,;	//07 -> [@]Array unidimensional contendo os Recnos
																		"ZZJ"		   	,;	//08 -> Alias do Arquivo Pai
																		cZZOKeySeek		,;	//09 -> Chave para o Posicionamento no Alias Filho
																		NIL				,;	//10 -> Bloco para condicao de Loop While
																		NIL				,;	//11 -> Bloco para Skip no Loop While
																		NIL				,;	//12 -> Se Havera o Elemento de Delecao no aCols 
																		NIL				,;	//13 -> Se Sera considerado o Inicializador Padrao
																		NIL				,;	//14 -> Opcional, Carregar Todos os Campos
																		NIL				,;	//15 -> Opcional, Nao Carregar os Campos Virtuais
																		NIL				,;	//16 -> Opcional, Utilizacao de Query para Selecao de Dados
																		.F.				,;	//17 -> Opcional, Se deve Executar bKey  ( Apenas Quando TOP )
																		.F.				,;	//18 -> Opcional, Se deve Executar bSkip ( Apenas Quando TOP )
																		NIL				,;	//19 -> Carregar Coluna Fantasma e/ou BitMap ( Logico ou Array )
																		NIL				,;	//20 -> Inverte a Condicao de aNotFields carregando apenas os campos ai definidos
																		NIL				,;	//21 -> Verifica se Deve Checar se o campo eh usado
																		NIL				,;	//22 -> Verifica se Deve Checar o nivel do usuario
																		NIL				,;	//23 -> Verifica se Deve Carregar o Elemento Vazio no aCols
																		@aZZOKeys		,;	//24 -> [@]Array que contera as chaves conforme recnos
																		@lLock			,;	//25 -> [@]Se devera efetuar o Lock dos Registros
																		@lExclu			,;	//26 -> [@]Se devera obter a Exclusividade nas chaves dos registros
																		1				,;	//27 -> Numero maximo de Locks a ser efetuado
																		Altera			 ;	//28 -> Utiliza Numeracao na GhostCol
																    );
														  ),;
										IF( lExecLock , ( lLock .and. lExclu ) , .T. );
		  		    }

	    IF !( lLocks := WhileNoLock( "ZZO" , NIL , NIL , 1 , 1 , .T. , 1 , 5 , bGetZZO ) )
			Break
		EndIF

		IF ( nOpc == 3  ) //Inclusao
			GdDefault( NIL , "ZZJ" , aZZJHeader , @aZZJCols , NIL , .F. )
		EndIF

		aSvZZJCols	:= aClone( aZZJCols )
		aSvZZOCols	:= aClone( aCols )

		lMod3Ret	:=	Modelo3(;
									cCadastro						,;	//cTitulo
									"ZZJ"		  						,;	//cAlias1
									"ZZO"								,;	//cAlias2
									@aZZJFields						,;	//aMyEncho/
									"StaticCall(u_ChamMat,Mod3Lok)"	,;	//cLinOk
									"StaticCall(u_ChamMat,Mod3Tok)"	,;	//cTudoOk
									nOpc							,;	//nOpcE
									nOpcGD							,;	//nOpcG,
									NIL								,;	//cFieldOk,
									.T.								,;	//lVirtual
									999								,;	//nLinhas
									aZZJAltera						,;	//aAltEnchoice
									NIL								,;	//nFreeze,
									NIL								,;	//aButtons
									NIL								,;	//aCordW
									NIL								 ;	//nSizeHeader
								)
	
		IF ( lMod3Ret )
	 		IF ( nOpc != 2 )
/*				MsAguarde(;
							{ ||;
									Mod3Ex1Grv(;
													@nOpc		,;	//01 -> Opcao de Acordo com aRotina
								 					@nReg		,;	//02 -> Numero do Registro do Arquivo Pai ( ZZO )
								 					@aZZJHeader	,;	//03 -> Campos do Arquivo Pai ( ZZJ )
								 					@aZZJVirtEn	,;	//04 -> Campos Virtuais do Arquivo Pai ( ZZJ )
								 					@aZZJCols	,;	//05 -> Conteudo Atual dos Campos do Arquivo Pai ( ZZJ )
								 					@aSvZZJCols	,;	//06 -> Conteudo Anterior dos Campos do Arquivo Pai ( ZZJ )
								 					@aHeader	,;	//07 -> Campos do Arquivo Filho ( ZZO )
								 					@aCols		,;	//08 -> Itens Atual do Arquivo Filho ( ZZO )
								 					@aSvZZOCols	,;	//09 -> Itens Anterior do Arquivo Filho ( ZZO )
								 					@aZZOVirtGd	,;	//10 -> Campos Virtuais do Arquivo Filho ( ZZO )
								 					@aZZORecnos	 ;	//11 -> Recnos do Arquivo Filho ( ZZO )
								 				 );
							};
						  )
*/
				MsAguarde(;
							{ ||;
									MovEst(;
							 					aZZJCols[1][1],; 	// Nr. Chamado
							 					aHeader,;			// Header do Arquivo Filho ( ZZO )
								 				aSvZZOCols	,;		// Itens Anterior do Arquivo Filho ( ZZO )
							 					aCols		,;			// Itens Atual do Arquivo Filho ( ZZO )
							 				);
							};
						  )
			EndIF
		EndIF

	END SEQUENCE

	FreeLocks( "ZZO" , aZZORecnos , .T. , aZZOKeys )
	FreeLocks( "ZZJ" , aZZJRecnos , .T. , aZZJKeys )
	
Return( NIL )

/*/
	Funcao:		Mod3Lok
	Autor:		Marinaldo de Jesus
	Descricao:	Funcao para Validacao da Linha Ok da GetDados
	Uso:		Generico
/*/
Static Function Mod3Lok()

	Local lLinOk  		:= .T.
	
	Local aCposKey

	Begin Sequence

		IF !( GdDeleted() )
			aCposKey := GdObrigat( aHeader )
			IF !( lLinOk := GdNoEmpty( aCposKey ) )
		    	Break
			EndIF
			aCposKey := GetArrUniqe( "ZZO" )
/*			IF !( lLinOk := GdCheckKey( aCposKey , 4 ) )
				Break
			EndIF
*/
			IF !( lLinkOk := GDCHECKKEY({"ZO_CODPRO"}) ) 
				Break
			EndIF
		EndIF

	End Sequence

Return( lLinOk )

/*/
	Funcao:		Mod3Tok
	Autor:		Marinaldo de Jesus
	Descricao:	Funcao Para Validacao do TudoOk da GetDados
	Uso:		Generico
/*/
Static Function Mod3Tok()

	Local lTudoOk		:= .T.
	
	Local nLoop
	Local nLoops
	Local nDeleted

	IF ( Type( "n" ) <> "N" )
		Private n := 0
	EndIF
	
	Begin Sequence
	
		nDeleted := GdFieldPos( "GDDELETED" )
		
		nLoops := Len( aCols )
		For nLoop := 1 To nLoops
			n := nLoop
			IF !( aCols[ n , nDeleted ] )
				IF !( lTudoOk := Mod3Lok() )
					Break
				EndIF
			EndIF
		Next nLoop
	
	End Sequence

Return( lTudoOk  )

/*/
	Funcao:		Mod3Ex1Grv
	Autor:		Marinaldo de Jesus
	Descricao:	Funcao para Gravacao/Exclusao das Informacoes se TudoOk
	Uso:		Generico
/*/
Static Function Mod3Ex1Grv(	nOpc			,;	//01 -> Opcao de Acordo com aRotina
						  				nReg			,;	//02 -> Numero do Registro do Arquivo Pai ( ZZJ )
									 	aZZJHeader	,;	//03 -> Campos do Arquivo Pai ( ZZJ )
									 	aZZJVirtEn	,;	//04 -> Campos Virtuais do Arquivo Pai ( ZZJ )
									 	aZZJCols		,;	//05 -> Conteudo Atual dos Campos do Arquivo Pai ( ZZJ )
									 	aSvZZJCols	,;	//06 -> Conteudo Anterior dos Campos do Arquivo Pai ( ZZJ )
									 	aZZOHeader	,;	//07 -> Campos do Arquivo Filho ( ZZO )
									 	aZZOCols		,;	//08 -> Itens Atual do Arquivo Filho ( ZZO )
									 	aSvZZOCols	,;	//09 -> Itens Anterior do Arquivo Filho ( ZZO )
									 	aZZOVirtGd	,;	//10 -> Campos Virtuais do Arquivo Filho ( ZZO )
									 	aZZORecnos	 ;	//11 -> Recnos do Arquivo Filho ( ZZO )
								  )

	Local aMestre	:= GdPutIStrMestre( 01 )
	Local aItens	:= {}
	Local cOpcao	:= IF( ( nOpc == 5 ) , "DELETE" , IF( ( ( nOpc == 3 ) .or. ( nOpc == 4 ) ) , "PUT" , NIL ) )
	Local cZZJCodigo	:= GetMemVar( "ZJ_NUM" )
	Local lAllModif	:= .F.
	Local lZZJModif	:= .F.
	Local lZZOModif	:= .F.
	Local lZZODelet	:= .F.
	
	Local aZZOColDel
	Local aZZORecDel
	
	Local nLoop
	Local nLoops
	Local nItens

	IF ( cOpcao == "DELETE" )
		GdSuperDel( aZZOHeader , @aZZOCols , NIL , .T. )
		lZZJModif := .T.
	EndIF

	IF ( lZZOModif := !ArrayCompare( aZZOCols , aSvZZOCols ) )
		IF ( cOpcao <> "DELETE" )
			GdSuperDel( aZZOHeader , @aZZOCols , NIL , .T. , GdGetBlock( "ZZO" , aZZOHeader , .F. ) ) 
		EndIF	
		lZZODelet := GdSplitDel( aZZOHeader , @aZZOCols , @aZZORecnos , @aZZOColDel , @aZZORecDel )
	EndIF

	IF ( lZZOModif )

		IF ( lZZODelet )

			aAdd( aItens , GdPutIStrItens() )
			nItens := Len( aItens )

			aItens[ nItens , 01 ] := "ZZO"
			aItens[ nItens , 02 ] := NIL
			aItens[ nItens , 03 ] := aClone( aZZOHeader )
			aItens[ nItens , 04 ] := aClone( aZZOColDel )
			aItens[ nItens , 05 ] := aClone( aZZOVirtGd )
			aItens[ nItens , 06 ] := aClone( aZZORecDel )
			aItens[ nItens , 07 ] := {}
			aItens[ nItens , 08 ] := NIL
			aItens[ nItens , 09 ] := NIL
			aItens[ nItens , 10 ] := ""

		EndIF

		aAdd( aItens , GdPutIStrItens() )
		nItens := Len( aItens )
		aItens[ nItens , 01 ] := "ZZO"
		aItens[ nItens , 02 ] := {;
									{ "FILIAL"	, xFilial( "ZZO" , xFilial( "ZZJ" ) ) },;
									{ "CHAMADO"		, cZZJCodigo };
							 	 }
		aItens[ nItens , 03 ] := aClone( aZZOHeader )
		aItens[ nItens , 04 ] := aClone( aZZOCols   )
		aItens[ nItens , 05 ] := aClone( aZZOVirtGd )
		aItens[ nItens , 06 ] := aClone( aZZORecnos )
		aItens[ nItens , 07 ] := {}
		aItens[ nItens , 08 ] := NIL
		aItens[ nItens , 09 ] := NIL
		aItens[ nItens , 10 ] := ""

	EndIF

	IF !( lZZJModif )
		nLoops := Len( aZZJHeader )
		For nLoop := 1 To nLoops
			aZZJCols[ 01 , nLoop ] := GetMemVar( aZZJHeader[ nLoop , 02 ] )
		Next nLoop
		lZZJModif := !( ArrayCompare( aZZJCols , aSvZZJCols ) )
	EndIF

 	lAllModif := ( ( lZZOModif ) .or. ( lZZJModif ) )

	IF ( lAllModif )

		aMestre[ 01 , 01 ]	:= "ZZJ"
		aMestre[ 01 , 02 ]	:= nReg
		aMestre[ 01 , 03 ]	:= lZZJModif
		aMestre[ 01 , 04 ]	:= aClone( aZZJHeader )
		aMestre[ 01 , 05 ]	:= aClone( aZZJVirtEn )
		aMestre[ 01 , 06 ]	:= {}
		aMestre[ 01 , 07 ]	:= aClone( aItens )
		aMestre[ 01 , 08 ]	:= ""

		GdPutInfoData( aMestre , cOpcao , .F. , .F. )

		IF ( cOpcao <> "DELETE" )
			ZZO->( FkCommit() )
			ZZJ->( FkCommit() )
		Else
			ZZJ->( FkCommit() )
			ZZO->( FkCommit() )
		EndIF

	EndIF

Return( NIL )


/*/
	Funcao:		MovEst
	Autor:		Ghandy
	Descricao:	Executa movimentacao de estoque apos confirmacao do usuario
	Uso:			Sistema Jupiter
/*/
Static Function MovEst(cChamado,aHeader,aSvZZOCols,aCols)
Local nLoops
Local nLoop
Local ExpA1 := {}
Local ExpN2 := 3
Local lGrv := .T.
Local nPosPro := AScan(aHeader, { |x| Alltrim(x[2]) = 'ZO_CODPRO'})
Local nPosQtd := AScan(aHeader, { |x| Alltrim(x[2]) = 'ZO_QTD'})
Local nPosTip := AScan(aHeader, { |x| Alltrim(x[2]) = 'ZO_TIPO'})
Local nPosDat := AScan(aHeader, { |x| Alltrim(x[2]) = 'ZO_DATLAN'})


PRIVATE lMsErroAuto := .F.

nLoops := Len( aCols )
Begin Transaction
For nLoop := 1 To nLoops
	IF !Empty(aCols[nLoop][nPosDat])
		lGrv := .F.
	ELSE
		IF !aCols[nLoop,LEN(aHeader)+1] // se o elemento nao foi deletado
			dbSelectArea("SB1")
			dbSetOrder(1)
			dbSeek(xFilial("SB1")+aCols[nLoop][nPosPro])
			dbSelectArea("ZZC")
			dbSetOrder(2)
			dbSeek(xFilial("ZZC")+cChamado)
			dbSelectArea("SB2")
			dbSetOrder(1)
			dbSeek(xFilial("SB2")+aCols[nLoop][nPosPro]+"TR") // Localiza saldo para o armazem Transito
			
			ExpA1 := {}
			aadd(ExpA1,{"D3_FILIAL",xFilial("SD3"),})
			aadd(ExpA1,{"D3_TM",IF(aCols[nLoop][nPosTip] == 0, "501", "001"),})
			aadd(ExpA1,{"D3_EMISSAO",dDatabase,})
			aadd(ExpA1,{"D3_DOC","CH"+Substr(cChamado,2),})
			aadd(ExpA1,{"D3_COD",aCols[nLoop][nPosPro],})
			aadd(ExpA1,{"D3_UM",SB1->B1_UM,})
			aadd(ExpA1,{"D3_LOCAL","TR",})
			aadd(ExpA1,{"D3_LOCALIZ",ZZC->ZC_CODTEC,})
			aadd(ExpA1,{"D3_QUANT",aCols[nLoop][nPosQtd],})
			aadd(ExpA1,{"D3_CUSTO1",SB2->B2_CM1,})
			MSExecAuto({|x,y| mata240(x,y)},ExpA1,ExpN2)
			If lMsErroAuto
				Mostraerro()
			Else
				// registra a operacao
				dbSelectArea("ZZO")
				dbSetOrder(2)
				dbSeek(xFilial("ZZO")+cChamado+aCols[nLoop][nPosPro]) // Localiza saldo para o tecnico
				IF !ZZO->(EOF())
			      RecLock("ZZO",.F.)
			      ZZO->ZO_QTDLAN := aCols[nLoop][nPosQtd]
			      ZZO->ZO_DATLAN := dDatabase
			      ZZO->(MsUnlock())		
	
					dbSelectArea("ZZG")
					dbSetOrder(1)
					dbSeek(xFilial("ZZG")+"TR"+ZZC->ZC_CODTEC+aCols[nLoop][nPosPro]) // Localiza saldo para o tecnico
			      RecLock("ZZG",.F.)
			      IF aCols[nLoop][nPosTip] == 0
			      	ZZG->ZG_QUANT -= aCols[nLoop][nPosQtd]
			  		ELSE
			      	ZZG->ZG_QUANT += aCols[nLoop][nPosQtd]
			  		ENDIF
			      ZZG->(MsUnlock())		
			   ENDIF
			EndIf
		ELSE // se a linha foi excluida nao lanca movimentacao no estoque mas registra a operacao
			dbSelectArea("ZZO")
			dbSetOrder(2)
			dbSeek(xFilial("ZZO")+cChamado+aCols[nLoop][nPosPro]) // Localiza saldo para o tecnico
			IF !ZZO->(EOF())
		      RecLock("ZZO",.F.)
		      ZZO->ZO_QTDLAN := 0
	   	   ZZO->ZO_DATLAN := dDatabase
	      	ZZO->(MsUnlock())		
	  		ENDIF
		ENDIF
	ENDIF
Next nLoop
End Transaction
IF !lGrv
	MsgBox("Ja houve movimentacao de estoque para este registro! "+chr(13)+chr(10)+;
			 "Para altera-la voce deve estornar o lancamento do doc"+chr(13)+chr(10)+;
			 "CH"+Substr(cChamado,2)+" de "+dTOc(aCols[1][nPosDat]), "Operacao Invalida", "Alert")
ENDIF
Return Nil







		